草庐IT

c++ - RAII 和 C++ STL

全部标签

c++ - 如何处理 RAII 的构造函数失败

我熟悉RAII的优点,但我最近在这样的代码中遇到了一个问题:classFoo{public:Foo(){DoSomething();...}~Foo(){UndoSomething();}}一切正常,除了构造函数...部分中的代码引发了异常,导致UndoSomething()从未被调用。有一些明显的方法可以解决该特定问题,例如将...包装在try/catchblock中,然后调用UndoSomething(),但是:这是重复的代码和b:try/catchblock是我尝试通过使用RAII技术避免的代码异味。而且,如果涉及多个Do/Undo对,代码可能会变得更糟,更容易出错,我们必须中途

c++ - 为什么 STL 实现如此难以理解?在这里如何改进 C++?

例如,为什么STL实现中的大多数成员都有_M_或_或__前缀?为什么有这么多样板代码?C++缺少哪些功能可以使vector(例如)实现更清晰、更简洁? 最佳答案 实现使用以下划线开头的名称,后跟一个大写字母或两个下划线,以避免与用户定义的宏发生冲突。这些名称在C++中是保留的。例如,可以定义一个名为Type的宏。然后#include.如果vector使用的实现Type作为模板参数名称,它会中断。但是,不允许定义名为_Type的宏。(或__type、type__等)。因此,vector可以安全地使用这些名称。

c++ - 为什么 STL 实现如此难以理解?在这里如何改进 C++?

例如,为什么STL实现中的大多数成员都有_M_或_或__前缀?为什么有这么多样板代码?C++缺少哪些功能可以使vector(例如)实现更清晰、更简洁? 最佳答案 实现使用以下划线开头的名称,后跟一个大写字母或两个下划线,以避免与用户定义的宏发生冲突。这些名称在C++中是保留的。例如,可以定义一个名为Type的宏。然后#include.如果vector使用的实现Type作为模板参数名称,它会中断。但是,不允许定义名为_Type的宏。(或__type、type__等)。因此,vector可以安全地使用这些名称。

c++ - 如何在 STL priority_queue 中进行有效的优先级更新?

我有一些对象的priority_queue:typedefpriority_queueQueue;Queuequeue;有时,其中一个对象的优先级可能会发生变化-我需要能够以有效的方式更新队列中该对象的优先级。目前我正在使用这种有效但似乎效率低下的方法:QueuenewQueue;while(!queue.empty()){Objectobj=queue.top();queue.pop();if(priorityHasChanged(obj))newQueue.push_back(Object(new_priority));elsenewQueue.push_back(obj);}ne

c++ - 如何在 STL priority_queue 中进行有效的优先级更新?

我有一些对象的priority_queue:typedefpriority_queueQueue;Queuequeue;有时,其中一个对象的优先级可能会发生变化-我需要能够以有效的方式更新队列中该对象的优先级。目前我正在使用这种有效但似乎效率低下的方法:QueuenewQueue;while(!queue.empty()){Objectobj=queue.top();queue.pop();if(priorityHasChanged(obj))newQueue.push_back(Object(new_priority));elsenewQueue.push_back(obj);}ne

c++ - 除了 OOP,为什么 C++ 比 C 更好?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭7年前。Improvethisquestion这听起来像是一个巨魔问题,但由于C++似乎很难完全掌握(而且我从来不知道STL实际上是它的“一部分”),我想知道使用C而不是C++的缺点是什么在不太依赖OOP时。C++有时可能有非常复杂的语法,这让我在尝试使用OGRE3D时有点困惑...... 最佳答案 C++具有C没有的非OO特性:模板函数重载引用文献命名空间您可以使用structs

c++ - 除了 OOP,为什么 C++ 比 C 更好?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题吗?更新问题,以便editingthispost提供事实和引用来回答它.关闭7年前。Improvethisquestion这听起来像是一个巨魔问题,但由于C++似乎很难完全掌握(而且我从来不知道STL实际上是它的“一部分”),我想知道使用C而不是C++的缺点是什么在不太依赖OOP时。C++有时可能有非常复杂的语法,这让我在尝试使用OGRE3D时有点困惑...... 最佳答案 C++具有C没有的非OO特性:模板函数重载引用文献命名空间您可以使用structs

c++ - end() 是否需要在 STL 映射/集中保持不变?

标准中的第23.1.2.8节规定,对集合/映射的插入/删除操作不会使这些对象的任何迭代器无效(指向已删除元素的迭代器除外)。现在,考虑以下情况:您想要实现一个具有唯一编号节点的图,其中每个节点都有固定数量(比如4个)的邻居。利用上述规则,您可以这样做:classNode{private://iteratorstoneighboringnodesstd::map::iteratorneighbors[4];friendclassGraph;};classGraph{private:std::mapnodes;};(EDIT:由于第4行中的Node不完整(见回复/评论),因此并非字面上如此

c++ - end() 是否需要在 STL 映射/集中保持不变?

标准中的第23.1.2.8节规定,对集合/映射的插入/删除操作不会使这些对象的任何迭代器无效(指向已删除元素的迭代器除外)。现在,考虑以下情况:您想要实现一个具有唯一编号节点的图,其中每个节点都有固定数量(比如4个)的邻居。利用上述规则,您可以这样做:classNode{private://iteratorstoneighboringnodesstd::map::iteratorneighbors[4];friendclassGraph;};classGraph{private:std::mapnodes;};(EDIT:由于第4行中的Node不完整(见回复/评论),因此并非字面上如此

c++ - STL::multimap - 我如何获取数据组?

Multimap本质上具有按键排序的数据组。我想要一种方法,通过它我可以访问这些单独的组并获取它们的汇总值。例如,在std::multimap我存储{"Group1",1},{"Group1",2},{"Group1",3},{"Group2",10},{"Group2",11},{"Group2",12}存储了这些值后,我应该能够迭代这个multimap并获得每个“组”的聚合值。问题是STL中没有定义任何函数来以这种方式访问​​MultiMaps。我可以使用lower_bound,upper_bound手动迭代multimap并汇总组的内容,但我希望在STL中已经定义了更好的方法?任